// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace Microsoft.AspNetCore.StaticWebAssets.Tasks;

public class StaticWebAssetProjectConfiguration
{
    public string Id { get; set; }
    public string Version { get; set; }
    public string Source { get; set; }
    public string GetBuildAssetsTargets { get; set; }
    public string AdditionalBuildProperties { get; set; }
    public string AdditionalBuildPropertiesToRemove { get; set; }
    public string GetPublishAssetsTargets { get; set; }
    public string AdditionalPublishProperties { get; set; }
    public string AdditionalPublishPropertiesToRemove { get; set; }
    public string TargetFramework { get; set; }

    public static StaticWebAssetProjectConfiguration FromTaskItem(ITaskItem taskItem) => new()
    {
        Id = taskItem.ItemSpec,
        Version = taskItem.GetMetadata(nameof(Version)),
        Source = taskItem.GetMetadata(nameof(Source)),
        GetBuildAssetsTargets = taskItem.GetMetadata(nameof(GetBuildAssetsTargets)),
        AdditionalBuildProperties = taskItem.GetMetadata(nameof(AdditionalBuildProperties)),
        AdditionalBuildPropertiesToRemove = taskItem.GetMetadata(nameof(AdditionalBuildPropertiesToRemove)),
        GetPublishAssetsTargets = taskItem.GetMetadata(nameof(GetPublishAssetsTargets)),
        AdditionalPublishProperties = taskItem.GetMetadata(nameof(AdditionalPublishProperties)),
        AdditionalPublishPropertiesToRemove = taskItem.GetMetadata(nameof(AdditionalPublishPropertiesToRemove)),
        TargetFramework = taskItem.GetMetadata(nameof(TargetFramework))
    };

    public ITaskItem2 ToTaskItem()
    {
        var result = new TaskItem(Id);
        result.SetMetadata(nameof(Version), Version);
        result.SetMetadata(nameof(Source), Source);
        result.SetMetadata(nameof(GetBuildAssetsTargets), GetBuildAssetsTargets);
        result.SetMetadata(nameof(AdditionalBuildProperties), AdditionalBuildProperties);
        result.SetMetadata(nameof(AdditionalBuildPropertiesToRemove), AdditionalBuildPropertiesToRemove);
        result.SetMetadata(nameof(GetPublishAssetsTargets), GetPublishAssetsTargets);
        result.SetMetadata(nameof(AdditionalPublishProperties), AdditionalPublishProperties);
        result.SetMetadata(nameof(AdditionalPublishPropertiesToRemove), AdditionalPublishPropertiesToRemove);
        result.SetMetadata(nameof(TargetFramework), TargetFramework);

        return result;
    }
}

